Technote 1041

Thread-Safe Toolbox Access From MRJ


ñ⁄éü

ÉcÅ[ÉãÉ{ÉbÉNÉXÇÃà¿ëSÇ»óòópï˚ñ@

åªé¿ìIÇ»ëŒâûï˚ñ@

ÅuLOCK Ç∑ÇÈÅvDZÇΔÇÃäÎåØ

éQçlï∂å£

Java ÇÕëSñ ìIÇ…É}ÉãÉ`ÉXÉåÉbÉhëŒâûÇ≈Ç∑Ç™ÅAMac OS ÇÕà·Ç¢Ç‹Ç∑ÅBMac OS ÇÃëÂïîï™ÇÕçƒì¸â¬î\Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBëÂàÊìIèÛë‘Ç…àÀë∂Ç∑ÇÈïîï™Ç™ëΩÇ≠ÅA1 ǬÇÃåƒÇ—èoǵǩÇÁéüÇÃåƒÇ—èoǵNjÇ≈àÍä—ǵÇΩèÛë‘Çï€Ç¬ïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÇΩÇflÅAJava Ç©ÇÁíºê⁄ Mac OS ÇåƒÇ—èoÇ∑ÇΔèdëÂÇ»ñ‚ëËÇ™ãNDZÇÈèÍçáǙdžÇËÇ‹Ç∑ÅBDZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAÉfÉxÉçÉbÉpÇ™çÏê¨Ç∑ÇÈÉlÉCÉeÉBÉuÉRÅ[ÉhÇ‚ JDirect ÉRÅ[ÉhÇ≈ OS Ç‚ÉcÅ[ÉãÉ{ÉbÉNÉXÇÃåƒÇ—èoǵÇçsǧç€ÅAà¿ëSÇ…ìÆçÏÇ∑ÇÈÇΩÇflÇÃìØä˙ÇÃÉeÉNÉjÉbÉNDžǬǢǃê‡ñæÇµÇ‹Ç∑ÅBDZÇÍÇÕì¡Ç… Mac OS X Ç÷ÇÃà⁄çsDždžÇΩǡǃèdóvÇ≈Ç∑ÅB



ÉcÅ[ÉãÉ{ÉbÉNÉXÇÃà¿ëSÇ»óòópï˚ñ@

Ç≤ë∂Ç∂ÇÃí ÇËÅAMac OS ÇΔÉcÅ[ÉãÉ{ÉbÉNÉX (DZDZǩÇÁÇÕ 2 ǬÇÇ‹ÇΔÇflǃä»íPÇ…ÅuÉcÅ[ÉãÉ{ÉbÉNÉXÅvÇΔåæÇ§Ç±ÇΔDžǵNjÇ∑) ÇÕ 1980 îNë„ÇÃèâÇflÇ…ÅAàÍìxÇ… 1 ǬÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇé¿çsǵÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇà 1 ǬÇÃÉXÉåÉbÉhǵǩé¿çsÇ≈ǴǻǢÉ}ÉVÉìÇëŒè€Ç…ê›åvÇ≥ÇÍÇΩLJÇÃÇ≈Ç∑ÅBǪÇÍà»å„ëΩè≠ÇÃêiï‡ÇÕdžÇËNjǵÇΩÇ™ÅADZÇÃäÓñ{ìIÇ»ê›åvÇÃêßñÒÇÃÇΩÇflÅAñ¢ÇæÇ…ÉcÅ[ÉãÉ{ÉbÉNÉXÇÕÉVÉìÉOÉãÉXÉåÉbÉhëŒâûÇΔǵǃégǧïKóvǙdžÇËÇ‹Ç∑ÅBMac Ç≈ÇÕï°êîÉAÉvÉäÉPÅ[ÉVÉáÉìä‘ÇÃã¶í≤ìIÉ}ÉãÉ`É^ÉXÉNÇ™â¬î\Ç≈Ç∑Ç™ÅADZÇÍÇÕÅAä˘íËÇÃéûì_ (WaitNextEvent ÇÃåƒÇ—èoǵ) Ç≈ǵǩÉvÉçÉZÉXêÿÇËë÷ǶÇçsǧDZÇΔÇ™Ç≈Ç´Ç∏ÅAâ∫à ÉÅÉÇÉäÇ…ï€éùÇ≥ÇÍÇΩëÂàÊìIèÛë‘ÇäÆëSÇ…ÉXÉèÉbÉvÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

DZÇÃÇΩÇflÅAMac OS ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ï°êîÉXÉåÉbÉhÇé¿çsǵÇÊǧÇΔÇ∑ÇÈÇΔñ‚ëËÇ™ãNDZÇËÇ‹Ç∑ÅBÉcÅ[ÉãÉ{ÉbÉNÉXÇÃåƒÇ—èoǵǙçƒì¸â¬î\Ç≈ǻǢÇΔÇÕÅA1 ǬÇÃÉXÉåÉbÉhÇ™ÉcÅ[ÉãÉ{ÉbÉNÉXåƒÇ—èoǵÇé¿çsǵǃǢÇÈä‘ÇÕëºÇÃÉXÉåÉbÉhÇ™ÉcÅ[ÉãÉ{ÉbÉNÉXÇ…ì¸ÇÍǻǢÇΔǢǧà”ñ°Ç≈Ç∑ÅBÇ≥ÇÁÇ…ÅAëSî ìIÇ…ëÂàÊìIèÛë‘ (åªç›Çà GrafPort Ç‚ÉäÉ\Å[ÉXÉ`ÉFÅ[Éìǻǫ) Ç™égópÇ≥ÇÍǃǢÇÈÇΩÇflÅAǪÇÃèÛë‘Ç…àÀë∂Ç∑ÇÈàÍòAÇÃåƒÇ—èoǵÇçsǧïKóvÇÃdžÇÈÉXÉåÉbÉhÇÕÅAǪÇÃä‘ÅAëºÇÃÉXÉåÉbÉhǙǪÇÃèÛë‘ÇóòópǵÇΩÇËïœçXÇ∑ÇÈÇÃÇñhÇÆïKóvǙdžÇËÇ‹Ç∑ÅB

ÇÌÇÍÇÌÇÍÇÕ MRJ 2.1 óp AWT ÇÃé¿ëïÇ≈DZÇÃñ‚ëËÇ…ëŒèàǵǻÇ≠ǃÇÕÇ»ÇËÇ‹ÇπÇÒÇ≈ǵÇΩÅBAWT ÇÃëÂïîï™Ç™ÅAJDirect2 Çí Ç∂ǃÉcÅ[ÉãÉ{ÉbÉNÉXÇåƒÇ—èoÇ∑ Java ÇÃÉRÅ[ÉhÇ≈èëÇ©ÇÍǃǢÇΩÇΩÇflÇ≈Ç∑ÅBÇÌÇÍÇÌÇÍÇÃéÊÇ¡ÇΩâåàçÙÇÕÇ≤Ç≠ìñÇΩÇËëOÇÃÅuÉNÉäÉeÉBÉJÉãÉZÉNÉVÉáÉìÅvÇégópÇ∑ÇÈLJÇÃÇ≈ÅAÉcÅ[ÉãÉ{ÉbÉNÉXÇégópÇ∑ÇÈÉRÅ[Éhïîï™ÇÉNÉäÉeÉBÉJÉãÉZÉNÉVÉáÉìÇΔǵÅAàÍéûÇ… 1 ǬÇÃÉXÉåÉbÉhÇæÇØÇµÇ©ÇªÇÃÉZÉNÉVÉáÉìÇ…ì¸ÇÍǻǢÇÊǧDžÇ∑ÇÈÇΔǢǧLJÇÃÇ≈Ç∑ÅB

Java ÇÃópåÍÇ≈ǢǧÇΔÅADZÇÃñ‚ëËÇÕëÂàÊÉIÉuÉWÉFÉNÉg (public Ç®ÇÊÇ— static Ç»ïœêîÇí ÇµÇƒÉAÉNÉZÉXÇ∑ÇÈ) Ç 1 å¬ópà”ǵǃÅADZÇÍÇìØä˙ÇÃÇΩÇflÇÃÉçÉbÉNÇΔǵǃì≠Ç©ÇπÇÈDZÇΔÇ≈é¿åªÇµÇ‹Ç∑ÅBÇÌÇÍÇÌÇÍÇÕÇ∑Ç◊ǃÇÃÉNÉäÉeÉBÉJÉãÉZÉNÉVÉáÉìÇǪÇÃÉIÉuÉWÉFÉNÉgÇ≈ìØä˙ÇéÊÇÈ Java ÉuÉçÉbÉNÇ…ì¸ÇÍÇÈDZÇΔÇ≈ëŒèàǵNjǵÇΩÅBǪÇÃÉIÉuÉWÉFÉNÉgÇΔÇÕéüÇÃLJÇÃÇ≈Ç∑ÅB

     com.apple.mrj.macos.toolbox.Toolbox.LOCK

(DZÇÍÇÕÅAcom.apple.mrj.macos.toolbox ÉpÉbÉPÅ[ÉWÇà Toolbox ÉNÉâÉXÇà LOCK ÇΔǢǧñºëOÇà static Ç≈ final Ç»ïœêîÇ≈Ç∑ÅB) DZÇÃïœêîÇÃégÇ¢ï˚ÇÕÅAìKêÿÇ»ÉCÉìÉ|Å[ÉgñΩóflǙdžÇÈLJÇÃÇΔâºíËÇ∑ÇÈÇΔÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

     synchronized( Toolbox.LOCK ) {
     ...
     }

ÇÌÇÍÇÌÇÍ MRJ É`Å[ÉÄÇÕDZÇÃDZÇΔÇÅuLOCKing (LOCK Ç∑ÇÈ)ÅvÇΔÇ©Åuusing the LOCK (LOCK Çégǧ)ÅvÇΔåƒÇÒÇ≈ǢNjÇ∑ÅB(âpåÍÇ≈î≠âπÇ∑ÇÈÇΔÇ´ÇÕÅuLOCKÅvÇÃïîï™ÇǪÇÍÇ™ëÂï∂éöÇ≈džÇÈDZÇΔÇ™ÇÌÇ©ÇÈÇÊǧã≠Ç≠åæÇ¢Ç‹Ç∑ÅB)

Ç»Ç∫DZÇÍÇ™ïKóvÇ©

ÇÌÇÍÇÌÇÍÇÕ AWT ǪÇÃLJÇÃÇê≥èÌÇ…ìÆçÏÇ≥ÇπÇÈÇΩÇflDžDZÇÃï˚ñ@ÇçÃópǵNjǵÇΩÅBǵǩǵÅAëºÇÃÉfÉxÉçÉbÉpÇ™ JDirect ÇégǧÉRÅ[ÉhÇèëÇ´ (ì«é“ÇÃëÂîºÇ™ÇªÇ§Ç≈ǵÇÂǧ)ÅAǪÇÃÉRÅ[ÉhÇÅAìØéûÇ… AWT LJégópÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ∑ÇÈèÍçáÅAìØÇ∂ìØä˙ÉeÉNÉjÉbÉNÇégǡǃÅAì«é“ÇÃÉRÅ[ÉhÇΔÉAÉbÉvÉãÇÃÉRÅ[ÉhÇÃä±è¬ÇñhÇÆïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃÇÊǧǻóùóRÇ≈ÅADZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇçÏê¨ÇµÇ‹ÇµÇΩÅB

ÉTÉìÉvÉã

äÆëSÇ…ìØä˙ÇÃéÊÇÍÇΩ SysBeep Ç÷ÇÃåƒÇ—èoǵÇçsǧä»íPÇ»ÉTÉìÉvÉãÇåfç⁄ǵNjÇ∑ÅB

import com.apple.mrj.macos.toolbox.Toolbox;
import SoundFunctions;    // SDK Çà JDirect ÉTÉìÉvÉãÉRÅ[ÉhÇÊÇË

...

public void playABeep( ) {
    synchronized(Toolbox.LOCK) {
        SoundFunctions.SysBeep(1);
    }
}

ÉlÉCÉeÉBÉuÉRÅ[Éh (JNI)

DZÇÍÇÕ JDirect ÇæÇØÇÃñ‚ëËÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÇçÏê¨ÇµÇƒ (ǮǪÇÁÇ≠ JNI Çégópǵǃ) ÉcÅ[ÉãÉ{ÉbÉNÉXÇÃåƒÇ—èoǵÇçsǧèÍçáÅAìØÇ∂ñ‚ëËÇ™ãNDZÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBÉlÉCÉeÉBÉuÉRÅ[ÉhÇ≈ÅAåªç›ÇÃÉ|Å[ÉgÇ‚ GrafPort ÇÃì‡ïîèÛë‘ǻǫÅAÉcÅ[ÉãÉ{ÉbÉNÉXÇÃèÛë‘ÇïœÇ¶ÇÈèÍçáÅAǪÇÃìÆçÏÇÕ LOCK Ç≈ìØä˙ÇéÊÇÁÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBàÍî‘ä»íPÇ»ï˚ñ@ÇÕÅAÉlÉCÉeÉBÉuÉRÅ[ÉhÇÕǪÇÃNjNjDžǵǃÅAÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÇåƒÇ—èoǵǃǢÇÈÇΔDZÇÎÇÇ∑Ç◊ǃïKÇ∏ LOCK Ç∑ÇÈDZÇΔÇ≈Ç∑ÅBǵǩǵÅAJNI API Ç≈ LOCK ÉIÉuÉWÉFÉNÉgÇéÊìæÇµÅAÉÇÉjÉ^ÇéÊìæ/âï˙Ç∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBDZÇÃèÍçáÅAÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÇ©ÇÁî≤ÇØÇÈëOÇ…ïKÇ∏ÉÇÉjÉ^Çâï˙Ç∑ÇÈÇÊǧÇ≠ÇÍÇÆÇÍLJíçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÍÇë”ÇÈÇΔ MRJ Ç™ÉnÉìÉOǵNjÇ∑ÅB

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ


åªé¿ìIÇ»ëŒâûï˚ñ@

é¿ç€ÇÕÅAè„ãLÇÃåxçêÇÕåªéûì_Ç≈ÇÕåµÇµÇ∑ǨNjÇ∑ÅBñ{ìñÇÕÅAç°ÇÃÇΔDZÇÎÉcÅ[ÉãÉ{ÉbÉNÉXÇ÷ÇÃåƒÇ—èoǵÇ 1 ǬécÇÁÇ∏ LOCK Ç∑ÇÈïKóvÇÕdžÇËÇ‹ÇπÇÒÅBÇ≥ǡǴÇà SysBeep ÇÃÇÊǧDžÅAÉVÉXÉeÉÄÇÃèÛë‘ïœçXÇãÅÇflÇ∏çsǢLJǵǻǢåƒÇ—èoǵÇÕåªç›ÇÃÇΔDZÇÎìØä˙ÇïKóvÇΔǵNjÇπÇÒÅBDZÇÍÇÕÅAMRJ 2.1 ÇÃÉXÉåÉbÉhÇ™ñ{óàÇÃà”ñ°Ç≈ÉvÉäÉGÉìÉvÉeÉBÉuÇ≈Ç»Ç≠ÅAJava ÉRÅ[ÉhÇÃÇ›ÇÉ^ÉCÉÄÉXÉâÉCÉXǵǃÅAǪǧå©ÇπÇ©ÇØÇƒÇ¢ÇÈÇæÇØÇæÇ©ÇÁÇ≈Ç∑ÅBÉcÅ[ÉãÉ{ÉbÉNÉXÇä‹ÇflÅAÉlÉCÉeÉBÉuÉRÅ[ÉhÇÃé¿çsÇÕÉvÉäÉGÉìÉvÉeÉBÉuÇ…Ç»ÇËÇ‹ÇπÇÒÅBÉcÅ[ÉãÉ{ÉbÉNÉXÇ÷ÇÃåƒÇ—èoǵÇÕÇ«ÇÍLJïKóvÇ»ÇæÇØç≈å„Ç‹Ç≈é¿çsÇ≥ÇÍÇ‹Ç∑ÅBëºÇà Java ÉXÉåÉbÉhÇ™äÑÇËçûÇfiDZÇΔÇÕÇ»Ç≠ÅAï ÇÃÉXÉåÉbÉhÇ…ÇÊÇÈÉcÅ[ÉãÉ{ÉbÉNÉXÇ÷ÇÃçƒì¸ÇÃäÎåØÇÕdžÇËÇ‹ÇπÇÒÅB

ǵǩǵÅADZDZÇ≈Åuç°ÇÃÇΔDZÇÎÅvÇΔèëÇ¢ÇΩDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBåªèÛǙDZǧǻǡǃǢÇÈÇÃÇÕÅAMac OS Ç≈ÇÕÅAÉVÉXÉeÉÄêSëüïîÇÃÉiÉmÉJÅ[ÉlÉãÇÃêßñÒÇ©ÇÁÅAÉXÉåÉbÉhÇ™ê≥ǵÇ≠é¿ëïÇ≈ǴǃǢǻǢÇΩÇflÇ≈Ç∑ÅBMac OS 8 (ï ñºÅuÉuÉãÅ[Åv) ÇÃè´óàÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕÅAÉiÉmÉJÅ[ÉlÉãÇ™â¸ëPÇ≥ÇÍÇÈÇΩÇflÅAè´óàìIÇ…ÇÕñ{ï®ÇÃÉvÉäÉGÉìÉvÉeÉBÉuÇ»é¿çsä¬ã´Ç™ÉTÉ|Å[ÉgÇ≥ÇÍÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAMac OS X ÇÕÅAå≥Ç©ÇÁñ{ï®ÇÃÉvÉäÉGÉìÉvÉeÉBÉuÉXÉåÉbÉhÇÉTÉ|Å[ÉgǵǃǢÇÈ Mach 3 É}ÉCÉNÉçÉJÅ[ÉlÉãÇ™äÓî’ÇΔÇ»ÇÈó\íËÇ≈ÅAJava ÇÕDZÇÍÇégópǵNjÇ∑ÅB

DZÇÃDZÇΔÇ©ÇÁÅAdžÇÁljÇÈÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÉRÅ[ÉhÇ≈ïœçXÇ™ïKóvÇ…Ç»ÇÈÇ≈ǵÇÂǧ (Mac OS ÇÃÉRÅ[ÉhÇÕÇ∑Ç◊ǃÅAOS X Çà Carbon API Ç≈ìÆçÏÇ∑ÇÈÇÊǧDžâ¸í˘Ç∑ÇÈïKóvǙdžÇÈÇΩÇflÅADZÇÍÇÕã¡Ç≠DZÇΔÇ≈ÇÕdžÇËÇ‹ÇπÇÒ)ÅBOS X Ç≈ÇÕÅAÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÇ™ëºÇÃÉXÉåÉbÉhÇ…ÇÊǡǃäÑÇËçûÇ‹ÇÍÇÈâ¬î\ê´Ç™Ç†ÇÈÇΩÇflÅAìØä˙ǙǢǡǪǧèdóvDžǻǡǃǴNjÇ∑ÅBÉfÉxÉçÉbÉpÇÕÅAJava ÉRÅ[ÉhÇ≈çsÇ¡ÇΩÇÃÇΔìØÇ∂ÇÊǧDžÅAÉlÉCÉeÉBÉuÉÅÉ\ÉbÉhÇÃì‡ïîÇ≈LJ LOCK ÇÃéÊìæ/âï˙ÇçsÇÌÇ»ÇØÇÍnjǻÇÁÇ»Ç≠Ç»ÇËÇ‹Ç∑ÅBMac OS X ǙLJǧè≠ǵãÔëÃâªÇµÇΩÇÁÅAìØä˙ÇÃÇΩÇflÇ…Ç«ÇÃÇÊǧǻçÏãΔÇ™ïKóvǩDžǬǢǃè⁄ǵǢèÓïÒÇíÒãüÇ∑ÇÈDZÇΔDžǵNjÇ∑ÅB

ǵÇΩǙǡǃÅAJDirect Ç‹ÇΩÇÕ JNI åoóRÇÃÉcÅ[ÉãÉ{ÉbÉNÉXåƒÇ—èoǵÇ Mac OS ÇÃè´óàÇÃÉoÅ[ÉWÉáÉìÇ≈é¿ëïÇ≥ÇÍÇΩ Java Ç≈LJìÆçÏÇ≥ÇπÇÈÇΩÇflÇ…ÇÕÅAç°Ç©ÇÁÇΩÇæÇøÇ…Ç∑Ç◊ǃÇÃÉcÅ[ÉãÉ{ÉbÉNÉXåƒÇ—èoǵÇ LOCK Ç∑ÇÈÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBó•ã`Ç…Ç∑Ç◊ǃÇ LOCK ǵǃǢÇÈéûä‘ǙǻǢèÍçáÇÕÅAè≠Ç»Ç≠ÇΔLJÅAëÂàÊä¬ã´Ç÷ÇÃä±è¬Ç™ñ‚ëËÇΔÇ»ÇÈàÍòAÇÃÉcÅ[ÉãÉ{ÉbÉNÉXåƒÇ—èoÇµÇæÇØÇÕïKÇ∏ LOCK Ç∑ÇÈÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅB

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ


ÅuLOCK Ç∑ÇÈÅvDZÇΔÇÃäÎåØ

écîOǻǙÇÁÅAÉ}ÉãÉ`ÉXÉåÉbÉhÉvÉçÉOÉâÉ~ÉìÉOÇÃåoå±é“Ç»ÇÁÇæÇÍLJǙåæÇ§ÇÊǧDžÅADZǧǵÇΩìØä˙Ç…ÇÕǪÇÍé©ëÃäÎåØÇ™î∫ǢNjÇ∑ÅBäÓñ{ìIǻLJÇÃÇΔǵǃÇÕÅAêÃÇ©ÇÁímÇÁÇÍÇΩÉfÉbÉhÉçÉbÉNÇΔǢǧñ‚ëËǙdžÇËÇ‹Ç∑ÅB

ÉfÉbÉhÉçÉbÉNDžǬǢǃÇÃä»íPÇ»ê‡ñæ

ÉfÉbÉhÉçÉbÉNÇ™î≠ê∂Ç∑ÇÈÇÃÇÕÅAdžÇÈÉÇÉjÉ^Çï€éùÇ∑ÇÈ (Java Ç≈åæÇ¶ÇŒ synchronized Ç…ã≤Ç‹ÇÍÇΩÉuÉçÉbÉNÇé¿çsíÜÇÃ) džÇÈÉXÉåÉbÉhÇ™ÅAï ÇÃÉXÉåÉbÉhÇ™ï€éùÇ∑ÇÈï ÇÃÉÇÉjÉ^ÇéÊìæÇµÇÊǧÇΔǵǃǮÇËÅAǵǩLJëÊ 2 ÇÃÉXÉåÉbÉhÇÕÅAç≈èâÇÃÉXÉåÉbÉhÇ™ï€éùǵǃǢÇÈÉÇÉjÉ^ÇéÊìæÇµÇÊǧÇΔǵǃÇ∑Ç≈Ç…ÉuÉçÉbÉNǵǃǢÇÈÅAÇΔǢǧèÛë‘DžǻǡÇΩèÍçáÇ≈Ç∑ÅBÇÌÇ©ÇËÇ‚Ç∑Ç≠ǢǢǩǶÇÈÇΔÅudžǻÇΩÇ™éÑÇ…ä êÿÇËÇìnÇ≥ǻǢå¿ÇËä ãlÇflÇìnÇ∑DZÇΔÇÕÇ≈ǴǻǢǙÅAdžǻÇΩÇÕéÑÇ™ä ãlÇflÇìnÇ∑Ç‹Ç≈ä êÿÇËÇìnǪǧÇΔǵǻǢÇÃÇ≈ÅAdžǻÇΩÇ…ä ãlÇflÇìnÇ∑DZÇΔÇÕÇ≈ǴǻǢÅvÇΔǢǧDZÇΔÇ≈Ç∑ÅBDZÇÍÇ≈ÇÕìÒêlÇΔLJêHéñÇ™Ç≈Ç´Ç‹ÇπÇÒÅBJava ÇÃèÍçáÇÕÅAóºï˚ÇÃÉXÉåÉbÉhÇ™âiãvÇ…ÉuÉçÉbÉNǵNjÇ∑ÅB

LOCK ÉIÉuÉWÉFÉNÉgDžǬǢǃLJÅADZÇÃì_Ç≈ÇÕâΩLJì¡ï Ç»Ç±ÇΔÇÕdžÇËÇ‹ÇπÇÒÅBLOCK ÇÕëΩêîÇÃìØä˙ëŒè€ÇΔÇ»ÇÈÇΩÇflÅAÉfÉbÉhÉçÉbÉNÇ™ãNDZÇÁǻǢǩì¡Ç…íçà”ÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÉfÉbÉhÉçÉbÉNÇãNDZÇ∑ìTå^ìIÇ»èÛãµÇéüÇ…é¶ÇµÇ‹Ç∑ÅB

public synchronized void foo( ) {
    System.out.println("In foo!");
    synchronized(Toolbox.LOCK) {
        SoundFunctions.SysBeep(1);
    }
}

public void bar( ) {
    synchronized(Toolbox.LOCK) {
        SoundFunctions.SysBeep(1);
        foo();
    }
}

Ç≥ǵÇ≥ÇÌÇËÇÃdžÇÈÉRÅ[ÉhÇ…ÇÕå©Ç¶Ç»Ç¢Ç©Ç‡ÇµÇÍÇ‹ÇπÇÒÇ™ÅAfoo ÇåƒÇ—èoǵÇΩÉXÉåÉbÉhÇ™ println Ç‹Ç≈óàǃäÑÇËçûÇ‹ÇÍÇΩèÍçáÇçlǶǃÇ≠ÇæÇ≥Ç¢ÅBDZDZÇ≈êßå‰ÇÕìØÇ∂ÉIÉuÉWÉFÉNÉgÇà bar ÉÅÉ\ÉbÉhÇ…êÿÇËë÷ÇÌÇËÇ‹Ç∑ÅB2 î‘ñ⁄ÇÃÉXÉåÉbÉhÇÕ bar ÉÅÉ\ÉbÉhÇÃé¿çsÇêiÇflÅAfoo ÇåƒÇ—èoǵNjÇ∑ÅBç≈èâÇÃÉXÉåÉbÉhÇÕÇ∑Ç≈DžǪÇÃÉIÉuÉWÉFÉNÉgÇÃÉÇÉjÉ^Çï€éùǵǃǢÇÈÇΩÇfl (foo Ç≈ìØä˙ÇéÊÇÈÇΩÇfl)ÅA2 î‘ÇflÇÃÉXÉåÉbÉhLJÉuÉçÉbÉNǵNjÇ∑ÅB

ǵnjÇÁÇ≠ǵǃÅAç≈èâÇÃÉXÉåÉbÉhÇ™çƒäJÇ≥ÇÍÅAfoo ÉÅÉ\ÉbÉhÇà synchronized ï∂Ç…ì¸ÇÎǧÇΔǵNjÇ∑ÅBécîOǻǙÇÁÅA2 î‘ñ⁄ÇÃÉXÉåÉbÉhÇ™Ç∑Ç≈Ç… LOCK Çï€éùǵǃǢÇÈÇΩÇflÅAç≈èâÇÃÉXÉåÉbÉhLJÉuÉçÉbÉNǵǃǵNjǢNjÇ∑ÅB

DZÇÍÇ≈óºï˚ÇÃÉXÉåÉbÉhÇ™ÉuÉçÉbÉNǵǃǵNjǢÅAÇ«ÇøÇÁǩǙÉÇÉjÉ^Çâï˙ǵǻǢå¿ÇËÅAÇ«ÇøÇÁÇÃÉXÉåÉbÉhLJêÊÇ÷êiÇfiDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBâiãvÇ…ÉfÉbÉhÉçÉbÉNÇ≈Ç∑ÅB

âÒîï˚ñ@

ÉfÉbÉhÉçÉbÉNÇñhÇÆñÕîÕìIÇ»âÒîçÙÇà 1 ǬÇÕÅAÉÇÉjÉ^ÇÃéÊìæÇèÌÇ…ìØÇ∂èáèòÇ≈çsǧDZÇΔÇ≈Ç∑ÅBè„ÇÃÉTÉìÉvÉãÇ≈ÉfÉbÉhÉçÉbÉNÇ™ãNDZÇÈå¥àˆÇÕÅAç≈èâÇÃÉXÉåÉbÉhÇ™êÊÇ…ÅAéÛÇØéÊÇ¡ÇΩÉIÉuÉWÉFÉNÉgÇÃÉçÉbÉNÇéÊìæÇµÇƒÇ©ÇÁÅAÉcÅ[ÉãÉ{ÉbÉNÉXÇà LOCK ÇéÊìæÇµÇƒÇ¢ÇÈÇÃÇ…ëŒÇµÇƒÅA2 î‘ñ⁄ÇÃÉXÉåÉbÉhÇÕãtÇÃèáèòÇ≈ÉçÉbÉNÇéÊìæÇ∑ÇÈÇΩÇflÇ≈Ç∑ÅB

ÇÌÇÍÇÌÇÍÇÃÉRÅ[ÉhÇ≈ÇÕÅAÉÇÉjÉ^ÇÃéÊìæèáèòÇΔǵǃÅAèÌÇ… LOCK ÇàÍî‘ç≈å„Ç…éÊìæÇ∑ÇÈÅAÇΔǢǧï˚êjÇéÊÇËNjǵÇΩÅBJava åæåÍÇ≈åæÇ§ÇΔÅALOCK Ç…ìØä˙ǵǃǢÇÈä‘ÇÕÅAëºÇÃâΩǩDžìØä˙ǵÇΩÇËÅAëºÇÃâΩǩDžìØä˙Ç∑ÇÈÉÅÉ\ÉbÉhÇåƒÇ—èoǵǃÇÕÇ»ÇÁǻǢÇΔǢǧDZÇΔÇ≈Ç∑ÅB(è„ÇÃÉTÉìÉvÉãÇ≈ÇÕÅAbar ÉÅÉ\ÉbÉhÇ™ foo ÇåƒÇ—èoÇ∑ÇΔǴDžDZÇÃÉãÅ[ÉãÇ™îjÇÁÇÍǃǢNjÇ∑ÅBç≈ó«ÇÃâåàñ@ÇÕ foo Ç÷ÇÃåƒÇ—èoǵÇìØä˙ÉuÉçÉbÉNÇÃäOÇ…à⁄Ç∑DZÇΔÇ≈ǵÇÂǧÅB)

ãÔëÃìIÇ…åæÇ§ÇΔÅADZÇÃïKëRÇÃåãâ ÇΔǵǃÅALOCK Çï€éùǵǃǢÇÈä‘ÇÕ AWT ÇåƒÇ—èoǵǃÇÕÇ»ÇÁǻǢÇΔǢǧDZÇΔÇ™èdóvÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÍÇÕÅApublic Ç» AWT ÉÅÉ\ÉbÉhÇÕÇ‡ÇøÇÁÇÒÅAǪÇÍÇÁÇ™åƒÇ—èoÇ∑ private Ç»ÉsÉAÉNÉâÉXLJÅAëΩêîÇÃìØä˙ÇçsǧÇΩÇflÇ≈Ç∑ÅB

ǧNjÇ≠DZǻÇπÇÈÇΔÇ®ä¥Ç∂ÇÃèÍçáÇÕÅAè„ãLÇÃãKë•Ç…ëΩè≠ÇÃó·äOÇê›ÇØÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBdžÇÈÉIÉuÉWÉFÉNÉgÇ…ìØä˙ǵǃǢÇÈä‘ÅAåàǵǃ LOCK ÇçsÇÌǻǢDZÇΔÇ™ÇÌǩǡǃǢÇÈèÍçáÇÕÅALOCK ǵÇΩÉuÉçÉbÉNÇ©ÇÁǪÇÃÉIÉuÉWÉFÉNÉgÇ…ìØä˙Ç∑ÇÈÉÅÉ\ÉbÉhÇåƒÇ—èoǵǃLJǩNjǢNjÇπÇÒÅBó·Ç¶ÇŒÅAVector ÉIÉuÉWÉFÉNÉgÇÃëÂîºÇÃÉÅÉ\ÉbÉhÇÕìØä˙ÇçsǢNjÇ∑Ç™ÅALOCK Ç≥ÇÍÇΩÉuÉçÉbÉNì‡Ç©ÇÁ Vector ÉIÉuÉWÉFÉNÉgÇÃÉÅÉ\ÉbÉhÇåƒÇ—èoǵǃLJëÂè‰ïvÇ≈ǵÇÂǧÅBǟǩDžǪÇà Vector Ç…ìØä˙ÇéÊÇÈÉRÅ[ÉhǙdžÇÈâ¬î\ê´Ç™îÒèÌÇ…è≠ǻǢǩÇÁÇ≈Ç∑ÅB

DZÇÃåãâ ÅAéüÇÃÇÊǧǻÉvÉçÉOÉâÉ~ÉìÉOÉXÉ^ÉCÉãÇ™ì±Ç´èoÇ≥ÇÍÇ‹Ç∑ÅBLOCK ÇÃÉuÉçÉbÉNÇÉcÅ[ÉãÉ{ÉbÉNÉXåƒÇ—èoǵDžÇ≈Ç´ÇÈÇæÇØÇ´Ç¬Ç≠îÌÇπÇÈï˚éÆÇ≈Ç∑ÅBÇ‹Ç∏ÉcÅ[ÉãÉ{ÉbÉNÉXÇåƒÇ—èoǵǃÅAéüÇ… Java Ç≈ëºÇÃèàóùÇçsÇ¢ÅAǪÇÍÇ©ÇÁLJǧàÍìxÉcÅ[ÉãÉ{ÉbÉNÉXÇåƒÇ—èoÇ∑ïKóvÇÃdžÇÈÉÅÉ\ÉbÉhǙdžÇÈÇΔǵNjÇ∑ÅBDZÇÃèÍçáÅAÉÅÉ\ÉbÉhëSëÃÇ LOCK ǵǃÇÕÇ¢ÇØÇ‹ÇπÇÒÅBǪǧÇ≈ÇÕÇ»Ç≠ÅAÉcÅ[ÉãÉ{ÉbÉNÉXÇåƒÇ—èoÇ∑ç≈èâÇÃÉOÉãÅ[ÉvÇΔ 2 î‘ñ⁄ÇÃÉOÉãÅ[ÉvÇǪÇÍǺÇÍìΔóßÇ… LOCK ǵÅAǪÇÃä‘ÇÃèàóùÇÕ LOCK ÉuÉçÉbÉNÇ…ÇÕì¸ÇÍÇ‹ÇπÇÒÅBDZǧǻÇÈÇΔÅAç≈èâÇÃÉOÉãÅ[ÉvÇΔ 2 î‘ñ⁄ÇÃÉOÉãÅ[ÉvÇΔÇ≈ÇÕëÂàÊìIÇ»èÛë‘Ç™ïœâªÇ∑ÇÈâ¬î\ê´Ç™Ç†ÇËÇ‹Ç∑ÅBïœçXÇ≥ÇÍǃÇÕç¢ÇÈèÍçáÇÕÅA2 î‘ñ⁄ÇÃÉOÉãÅ[ÉvÇÃêÊì™Ç≈èÛë‘Çê›íËǵíºÇ∑Ç©ÅAâΩÇΔÇ© 2 ǬÇÃÉOÉãÅ[ÉvÇ 1 ǬDžNjÇΔÇflǃÅAä‘Çà Java ÉRÅ[ÉhÇëOÇ©å„ÇÎÇ…í«Ç¢èoÇπÇÈÇÊǧÅAÉRÅ[ÉhÇÃèáèòÇïœÇ¶ÇÈDZÇΔÇ™Ç≈ǴǻǢǩåüì¢ÇµÇƒÇ›ÇÈDZÇΔÇ≈Ç∑ÅB

ÉfÉbÉhÉçÉbÉNÇÃÉfÉoÉbÉO

ÇÌÇÍÇÌÇÍÇÕ MRJ äJî≠ÇÃç€Ç…Ç–Ç«Ç≠ÉfÉbÉhÉçÉbÉNÇ…îYÇ‹Ç≥ÇÍÇΩÇΩÇflÅAÉfÉbÉhÉçÉbÉNÇÃÉfÉoÉbÉOÉTÉ|Å[ÉgÇ MRJ VM Ç…í«â¡ÇµÇ‹ÇµÇΩÅB

Ç‹Ç∏ÅAMRJLib ÇÃÉfÉoÉbÉOÉrÉãÉhÇ≈ÇÕÅAÉXÉåÉbÉhÉXÉPÉWÉÖÅ[ÉâÇ…ÉfÉbÉhÉçÉbÉNåüímã@î\Çì¸ÇÍNjǵÇΩÅBDZÇÃã@î\ÇÕÅAè„ãLÇ≈ê‡ñæÇµÇΩìTå^ìIÇ»ÉfÉbÉhÉçÉbÉNÇÃÉPÅ[ÉXÇåüímÇ∑ÇÈLJÇÃÇ≈ÅAÉfÉbÉhÉçÉbÉNÇåüímÇ∑ÇÈÇΔÅAǪÇÍÇí ímÇ∑ÇÈÉÜÅ[ÉUÉuÉåÉCÉNÇ≈ë¶ç¿Ç… MacsBug Ç…ì¸ÇËÇ‹Ç∑ÅBǪÇÍà»å„ÇÕÅAà»â∫Ç≈ê‡ñæÇ∑ÇÈÉeÉNÉjÉbÉNÇégǡǃè⁄ǵǢèÓïÒÇìæÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB(DZÇÃÉfÉoÉbÉOÉrÉãÉhÇÕ MRJ 2.1 SDK Ç…ïtëÆÇµÇ‹Ç∑ÅBÉCÉìÉXÉgÅ[Éãï˚ñ@Ç‚è⁄ç◊éñçÄDžǬǢǃÇÕÅAïtëÆÇà Read-Me ÉtÉ@ÉCÉãÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB) í èÌÇÃç≈ìKâªÉrÉãÉhÇà MRJLib Ç≈LJÅAMRJ Çà 'dcmd' Ç™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÍÇŒÅAMacsBug ÇégópǵÅA 'mrj dl' Ç®ÇÊÇ— 'mrj sync' ÉRÉ}ÉìÉhÇ≈ÅAåªç›ÉfÉbÉhÉçÉbÉNÇ‹ÇΩÇÕÉfÉbÉhÉçÉbÉNÇ…ãflÇ¢ìØä˙ÇÃñ‚ëËÇ™ãNDZǡǃǢÇÈÇ©Çí≤Ç◊ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇà 2 ǬÇÃÉRÉ}ÉìÉhÇÕÅAñ‚ëËÇÃÉXÉåÉbÉhÇ‚ÉIÉuÉWÉFÉNÉgÇÃèÓïÒÇï\é¶ÇµÇ‹Ç∑ÅB( 'dcmd' ÇÕ MRJ 2.1 SDK Ç…ïtëÆÇµÇ‹Ç∑ÅBè⁄ç◊èÓïÒÇΔãÔëÃìIÇ»ÉRÉ}ÉìÉhÇÃópñ@DžǬǢǃÇÕÅAïtëÆÇà Read-Me ÉtÉ@ÉCÉãÇΔÅuTechnote 1154: MacsBug Ç≈ Java ÉRÅ[ÉhÇÉfÉoÉbÉOÇ∑ÇÈï˚ñ@ÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB)

êÊì™ÉyÅ[ÉWÇ…ñflÇÈ


éQçlï∂å£

  • ÅuTechnote 1154: MacsBug Ç≈ Java ÉRÅ[ÉhÇÉfÉoÉbÉOÇ∑ÇÈï˚ñ@Åv
  • ÅuUsing JDirect To Access MacOS Code From JavaÅv
    JDirect ÇÃä»íPÇ»éËà¯Ç´ÅBMRJ 2.1 SDK ÇÃÅudocsÅvÉtÉHÉãÉ_Ç…é˚ò^ÅB
  • OaksÅAScottÅAWong íòÅwJava ThreadsÅxO'Reilly äßÅB1997 îNÅB
    O'Reilly ÇÃóDÇÍÇΩèëê–Ç≈ÅAJava ÇÃÉ}ÉãÉ`ÉXÉåÉbÉhÇ®ÇÊÇ—ÉXÉåÉbÉhÇÃéËà¯èëÇΔǵǃç≈ìKÅBèâêSé“Ç™ì«Ç›Ç‚Ç∑Ç≠èëÇ©ÇÍǃǢÇÈÇ™ÅAè„ãâÉÜÅ[ÉUÇÃÇΩÇflÇ…Ç»ÇÈçÄñ⁄LJåfç⁄ÅB
  • LeaÅADoug íòÅwConcurrent Programming in Java: Design Principles and PatternsÅxAddison-Wesley äßÅB1997 îNÅB
    îÒèÌÇ…óDÇÍÇΩÅAì‡óeÇÃè[é¿ÇµÇΩèëê–ÇæÇ™ÅAÉAÉJÉfÉ~ÉbÉNÇ»ÇΩÇflLJǃdžNjÇ∑ì«é“LJǢÇÈǩLJǵÇÍÇ‹ÇπÇÒÅBé¿ÇÕéÑé©êgÇ‹ÇæëSïîì«Ç›Ç´Ç¡ÇƒÇ¢Ç‹ÇπÇÒÅB


êÊì™ÉyÅ[ÉWÇ…ñflÇÈ